package com.py.custom.tms.application.jvm.gc;

import org.checkerframework.checker.units.qual.K;

import java.util.ArrayList;
import java.util.concurrent.ThreadLocalRandom;

/**
 * description：
 *
 * @author pengyou
 * @version 1.0.0
 * @date 2022/3/6
 */
public class CMSTest {

    public static void main(String[] args) throws InterruptedException {
        int a = 1;

        // Eden: 5.3 MB
        // s: 0.6MB
        // old: 13.3MB
        // 介绍：2.722时间，
        // -XX:+CMSIncrementalMode
        // -XX:+PrintHeapAtGC
        // -XX:+UseG1GC

        // 收集了：15*1 K + ArrayList扩容时候产生的垃圾
        // 1500k - 15k

        // 分配空间失败，说明空间不够用造成了GC；ParNew说明是 Parallel New垃圾收集器；
        // 5504K->639K(6144K)：GC前使用空间->GC后使用空间(当前区域的总空间：e+s1) ；
        // 0.0175660 secs：花费的时间
        // 5504K->2898K(19840K)：堆区垃圾回收前的大小，堆区垃圾回收后的大小，堆区总大小。
        // 0.0177798 secs： 该内存区域GC耗时，单位是秒
        // 2.722: [GC (Allocation Failure) 2.722: [ParNew: 5504K->639K(6144K), 0.0175660 secs] 5504K->2898K(19840K), 0.0177798 secs] [Times: user=0.02 sys=0.03, real=0.02 secs]
        // 10.902: [GC (Allocation Failure) 10.902: [ParNew: 6143K->640K(6144K), 0.0098634 secs] 8402K->8185K(19840K), 0.0100000 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
        ArrayList<int[]> objects = new ArrayList<>(5260);
        System.gc();
        while (true) {
            // 1k 字节
            int[] ints = new int[256];
            objects.add(ints);
//            Thread.sleep(10);
            a++;
            if (a > 5263) {
                for (int i = 0; i < objects.size(); i++) {
                    int mode = i % 10;
                    if (mode < 9) {
                        objects.set(i, null);
                    }
                }
                System.out.println("第" + a + "次分配空间：1KB ;" + " 清除槽位：" + a);
            }
        }
    }
}
